package com.zhiche.lisa.lspm.service.driver;

import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.IService;
import com.zhiche.lisa.core.supports.BaseException;
import com.zhiche.lisa.lspm.dao.model.carrier.bo.CarAndDriverInfoLineBO;
import com.zhiche.lisa.lspm.dao.model.carrier.bo.CarrierDriverBO;
import com.zhiche.lisa.lspm.dao.model.driver.Driver;
import com.zhiche.lisa.lspm.dao.model.driver.bo.*;
import com.zhiche.lisa.lspm.dto.*;
import com.zhiche.lisa.lspm.vo.driver.*;
import com.zhiche.lisa.lspm.vo.vehicle.CarAndDriverInfoLineVO;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;


/**
 * 司机登记 service
 */
public interface IDriverService extends IService<Driver> {

    /**
     * 司机列表
     */
    Page<DriverLineVO> driverLine(Page<DriverLineBO> page);


    /**
     * 认证的司机列表
     */
    Page<DriverLineVO> authedDriverLine(Page<DriverLineBO> page);

    /**
     * 车辆与司机关系列表
     */
    Page<CarAndDriverInfoLineVO> carAndDriverInfoLine(Page<CarAndDriverInfoLineBO> page);


    /**
     * 添加司机
     */
    void addDriver(ModifyDriverBO modifyDriverBO, String authorization);

    boolean updateLicense(ModifyDriverBO modifyDriverBO);

    void deleteLicense(ModifyDriverLicenseBO modifyDriverLicenseBO);

    /**
     * 查找编辑信息
     */
    ModifyDriverBO findModifyInfo(Long id);

    /**
     * 编辑司机
     */
    void modifyDriver(ModifyDriverBO modifyDriverBO) throws BaseException;


    /**
     * 获取承运商下的司机
     */
    Page<DriverLineVO> getDriverByLsp(Page<DriverLineVO> page);

    /**
     * 停用司机
     */
    List<String> discontinuatDriver(Long[] driverIds, String token) throws BaseException;

    /**
     * 启用司机
     */
    List<String> enableDriver(Long[] driverIds, String token) throws BaseException;


    /**
     * 根据承运商 id 批量更新状态
     */
    void batchUpdateStatusByLspId(Integer authStatus, Integer status, List<Long> lspIdList);


    /**
     * 根据司机ID认证司机
     */
    List<String> batchUpdateAuthStatusByIds(Long[] driverIds, String authorization) throws BaseException;

    /**
     * 根据司机ID取消认证司机
     */
    void batchUpdateCancelAuthStatusByIds(Long[] driverIds) throws BaseException;

    /**
     * 根据承运商 id 数组获取底下的所有司机 id
     */
    List<Long> selectIdByLspIds(List<Long> lspIdList);

    /**
     * 根据ID批量更新状态
     */
    void batchUpdateAuthStatusByIds(Integer authStatus, Integer status, List<Long> idList);

    /**
     * 查询司机和牵引车
     */
    Page<DriverCarrierBO> queryPageDriverCarrier(Page<DriverCarrierBO> page, String authorization);

    /**
     * 查询可用牵引车
     *
     * @param driverId     司机ID
     * @param carrierPlate 牵引车车牌
     */
    List<CarrierDriverBO> queryUsableCarrier(Long driverId, String carrierPlate);

    /**
     * 绑定挂车
     *
     * @param driverId  司机ID
     * @param carrierId 牵引车ID
     */
    boolean bingCarrier(Long driverId, Long carrierId, Long tenantId, String authorization);

    /**
     * 解绑挂车
     *
     * @param driverId  牵引车ID
     * @param carrierId 挂车ID
     */
    boolean unbingCarrier(Long driverId, Long carrierId, String authorization);

    /**
     * 按照ID删除司机
     */
    List<String> deleteByIds(Long[] driverIds, String token);

    /**
     * 更新司机
     */
    void updateDriver(DriverBO driverBO) throws BaseException;

    /**
     * 更新附件信息
     */
    void updateDriverAttach(AttachVO driverAttachVO, String authorization) throws BaseException;


    /**
     * 根据id获取司机
     */
    DriverBO getDriverById(Long id) throws BaseException;


    /**
     * 获取司机认证信息
     */
    DriverCertificationBO getDriverCertification(Long drivertId) throws BaseException;

    /**
     * 根据手机号登陆获取司机信息
     */
    DriverBO loginDriver(String moblie) throws BaseException;

    /**
     * 注册司机
     */
    Driver registDriver(String mobile, Long accountId, Long tenantId) throws BaseException;

    /**
     * 获取所有司机
     */
    List<DriverBO> getAllDriver() throws BaseException;

    /**
     * 接收uaa通过mq传过来的accountId更新司机accountId
     */
    void updateDriverAccountId(String accountDriverVO) throws BaseException;

    /**
     * 添加司机信息推送到mq添加账号
     */
    void driverSendMessage(Driver driver, String authorization);

    /**
     * 根据uaa注册账号信息来添加司机数据
     */
    void getDriverIfon(String registDriverInfo) throws BaseException;

    /**
     * 添加司机信息
     */
    void registDriver(RegistDriverVO registDriverVO);

    /**
     * 更新司机基本信息
     */
    Driver updateDriver(DriverBasicVO driver, String authorization);

    /**
     * 获取司机
     */
    DriverBasicVO getDriverInfoLine(Long driverId);

    /**
     * 开通司机账号列表
     */
    Page<DriverAccountVO> openDriverList(Page<Driver> page, String authorization);

    /**
     * 更换挂车所属承运商并解除相关绑定
     * 此时需解除牵引车与挂车、司机的绑定关系
     *
     * @param carrierIds    车辆ID集合
     * @param lspId         目标承运商
     * @param isAllTransfer 是否转移牵引车和挂车
     */
    boolean transferDriver(Long[] carrierIds, Long lspId, Integer isAllTransfer, String authorization);


    /**
     * 更换司机所属承运商
     */
    Integer updateDriverLspRelation(Driver driver);

    /**
     * 根据id号，恢复指定司机的删除状态
     */
    List<String> updateDeleteStatus(List<Long> ids, String token);

    /**
     * 查询司机绑定的车队
     */
    DriverToErpVO driverFleetByCarrier(Long id);

    /**
     * 司机信息推otm
     */
    void driverToOtm(long driverId);

    /**
     * 查询司机信息
     */
    Driver queryDriverCheckInStatus(Long id, Long checkinId, HttpServletRequest request);

    /**
     * 查询所有已经认证的司机信息
     */
    List<Driver> queryAuthDriver();

    /**
     * 判断是否是中联创建车队里的司机
     */
    DriverToErpVO isUnlcnFleetDriver(Long driverId, String authorization);

    /**
     * 根据司机名称获取司机信息
     */
    Map<Long, Driver> queryDriverByName(List<ArFundDTO> arFundDTOS);

    /**
     * 批量获取司机信息
     */
    List<Driver> getDriverAll(List<Driver> driverDTOs);

    /**
     * 导出司机/车辆信息到excel
     */
    List<DriverExportDTO> exportDriver(Map<String, String> condition);

    /**
     * 根据名称和手机号获取所有司机信息
     */
    List<Driver> queryDriverByCorpName(String corpName);

    /**
     * 根据司机手机号获取司机信息 包含承运商/车队信息
     */
    DriverDTO queryDriverWithFleet(String mobile);


    /**
     * 推送司机到erp
     */
    void authDriverToERP(String authorization, Long driverId);


    Driver selectByIdNoTenant(Long id);

    /**
     * 获取司机基础信息
     */
    DriverBasicDTO queryDriverBasic(Map<String, String> commonDTO);

    /**
     * 无TenantId查询司机
    * */
    List<Driver> selectListNoTenant(Wrapper<Driver> driverWrapper);

    Page<DriverTypeDTO> getDriverList(Page<DriverTypeDTO> page);

    List<Driver> selectByLspId(String lspId);

    Driver selectDriverByFleetBindId(Long fleetBindId);
}
